package design.patterns.singlemode;

/**
 * singlemode---懒汉模式
 * 1.构造方法私有化
 * 2.内部创建实例，唯一的，提供给外部使用。
 */

public class SingleV2 {
    /**
     * 1.构造方法私有化，不允许外部直接创建对象
     */
    private SingleV2() {

    }

    /**
     * 3.面向对象的封装，控制访问的安全 将类方法私有化
     * 声明对象，单不创建对象(实例)
     */
    private static SingleV2 instance1;

    /**
     * 上面将实例私有化了，那么就提供一个获取实例的公开的方法
     * @return
     */
    public synchronized static SingleV2 getInstance1(){
        /**
         * 再使用时才进行创建
         * 所以懒汉模式在加载类时比较快，但是在运行时获取对像的速度是相对饿汉较慢的
         * 懒汉模式线程时不安全的
         * 饿汉是线程安全的因为这个类在加载的时候就实例化了，就算thread1和thread2同时获取它，取到的是类加载时实例化的那个变量的值，
         * 所以说是线程安全的；而懒汉式线程不安全，
         * 因为有可能thread1在if（instance==null）判断为真时进入了if体里但又没开始实例化，而这时thread2也进来了，最终就会有2个实例了
         * 加上同步 synchronized 后才能保证多线程安全
         */
        if (instance1 == null){
            instance1 = new SingleV2();
        }
        return instance1;
    }

}
